﻿/**
 * @file NisProhibitedPassage_Struct.h
 * @brief NisProhibitedPassage
 * @details 
 * @mainpage http://www.navinfo.com/
 * @author Navinfo
 * @email 400-810-0880
 * @license Navinfo Co.,Ltd. All rights reserved
 */
#ifndef	__NISPROHIBITEDPASSAGESTRUCT_H_
#define	__NISPROHIBITEDPASSAGESTRUCT_H_

PRAGMA_PACK_PUSH

namespace Navinfo {
namespace Nis {

class CSlowRoadUsers;
class CProhibitedPassageFlag;
class CProhibitedPassage;
class CProhibitedPassageSet;



/**
 * @brief 慢速道路使用者
 * 
 */
class DLL_PUBLIC CSlowRoadUsers
{
public:
	CSlowRoadUsers();

	explicit CSlowRoadUsers(
		uchar v_ 
		);

public:
	/**
	 * @brief 取得IsInclusive
	 * @details 
	 *
	 * @return 如果设置为true，则该属性对所有指定的车辆类型有效；如果设置为false，则该属性对除指定车辆以外的所有车辆类型有效
	 */
	Navinfo::Nis::BOOL GetIsInclusive() const;

	/**
	 * @brief 取得IsBicycle
	 * @details 
	 *
	 * @return 自行车
	 */
	Navinfo::Nis::BOOL GetIsBicycle() const;

	/**
	 * @brief 取得IsPedestrian
	 * @details 
	 *
	 * @return 步行街
	 */
	Navinfo::Nis::BOOL GetIsPedestrian() const;


public:
	union {
		uchar													v;
		struct {
			uchar												m_ucIsInclusive				: 1;			///<	  如果设置为true，则该属性对所有指定的车辆类型有效；如果设置为false，则该属性对除指定车辆以外的所有车辆类型有效  
			uchar												m_ucIsBicycle				: 1;			///<	  自行车  
			uchar												m_ucIsPedestrian			: 1;			///<	  步行街  
		};
	};
};


/**
 * @brief ProhibitedPassageFlag
 * 
 */
class DLL_PUBLIC CProhibitedPassageFlag
{
public:
	CProhibitedPassageFlag();

	explicit CProhibitedPassageFlag(
		ushort v_ 
		);

public:
	/**
	 * @brief 取得LinearRangeFlag
	 * @details 
	 *
	 * @return 是否有线性区间范围
	 */
	Navinfo::Nis::BOOL GetLinearRangeFlag() const;

	/**
	 * @brief 取得PublicServiceVehiclesFlag
	 * @details 
	 *
	 * @return 是否存在公共服务车辆限制
	 */
	Navinfo::Nis::BOOL GetPublicServiceVehiclesFlag() const;

	/**
	 * @brief 取得SlowRoadUsersFlag
	 * @details 
	 *
	 * @return 是否存在慢行道路用户限制
	 */
	Navinfo::Nis::BOOL GetSlowRoadUsersFlag() const;

	/**
	 * @brief 取得OccupancyFlag
	 * @details 
	 *
	 * @return 是否存在车辆乘员数量限制
	 */
	Navinfo::Nis::BOOL GetOccupancyFlag() const;

	/**
	 * @brief 取得AuthorizationFlag
	 * @details 
	 *
	 * @return 是否存在授权道路
	 */
	Navinfo::Nis::BOOL GetAuthorizationFlag() const;

	/**
	 * @brief 取得FrequentlyUsedVehicleTypesFlag
	 * @details 
	 *
	 * @return 是否有车辆类型
	 */
	Navinfo::Nis::BOOL GetFrequentlyUsedVehicleTypesFlag() const;

	/**
	 * @brief 取得DaysOfWeekFlag
	 * @details 
	 *
	 * @return 是否有以日、周来描述的时间范围
	 */
	Navinfo::Nis::BOOL GetDaysOfWeekFlag() const;

	/**
	 * @brief 取得DateRangeOfYearFlag
	 * @details 
	 *
	 * @return 是否有以日期来描述的时间范围
	 */
	Navinfo::Nis::BOOL GetDateRangeOfYearFlag() const;

	/**
	 * @brief 取得TimeRangeOfDayFlag
	 * @details 
	 *
	 * @return 是否有以小时、分来描述的时间范围
	 */
	Navinfo::Nis::BOOL GetTimeRangeOfDayFlag() const;


public:
	union {
		ushort													v;
		struct {
			ushort												m_ucLinearRangeFlag			: 1;			///<	  是否有线性区间范围  
			ushort												m_ucPublicServiceVehiclesFlag	: 1;		///<	  是否存在公共服务车辆限制  
			ushort												m_ucSlowRoadUsersFlag		: 1;			///<	  是否存在慢行道路用户限制  
			ushort												m_ucOccupancyFlag			: 1;			///<	  是否存在车辆乘员数量限制  
			ushort												m_ucAuthorizationFlag		: 1;			///<	  是否存在授权道路  
			ushort												m_ucFrequentlyUsedVehicleTypesFlag	: 1;	///<	  是否有车辆类型  
			ushort												m_ucDaysOfWeekFlag			: 1;			///<	  是否有以日、周来描述的时间范围  
			ushort												m_ucDateRangeOfYearFlag		: 1;			///<	  是否有以日期来描述的时间范围  
			ushort												m_ucTimeRangeOfDayFlag		: 1;			///<	  是否有以小时、分来描述的时间范围  
		};
	};
};


/**
 * @brief 通行规制
 * 
 */
class DLL_PUBLIC CProhibitedPassage
{
public:
	CProhibitedPassage();

	explicit CProhibitedPassage(
		  const CProhibitedPassageFlag &m_clFlag_
		, const Navinfo::Nis::CTimeRangeOfDay &m_clTimeRangeOfDay_ = Navinfo::Nis::CTimeRangeOfDay()
		, const Navinfo::Nis::CDateRangeOfYear &m_clDateRangeOfYear_ = Navinfo::Nis::CDateRangeOfYear()
		, const Navinfo::Nis::CDaysOfWeek &m_clDaysOfWeek_ = Navinfo::Nis::CDaysOfWeek()
		, const Navinfo::Nis::CFrequentlyUsedVehicleTypes &m_clFrequentlyUsedVehicleTypes_ = Navinfo::Nis::CFrequentlyUsedVehicleTypes()
		, const Navinfo::Nis::CAuthorization &m_clAuthorization_ = Navinfo::Nis::CAuthorization()
		, const Navinfo::Nis::COccupancy &m_clOccupancy_ = Navinfo::Nis::COccupancy()
		, const CSlowRoadUsers &m_clSlowRoadUsers_ = CSlowRoadUsers()
		, const Navinfo::Nis::CPublicServiceVehicles &m_clPublicServiceVehicles_ = Navinfo::Nis::CPublicServiceVehicles()
		, const Navinfo::Nis::CLinearRange &m_clLinearRange_ = Navinfo::Nis::CLinearRange()
		);

public:
	/**
	 * @brief 取得Flag
	 *
	 * @return Flag
	 */
	const CProhibitedPassageFlag& GetFlag() const;

	/**
	 * @brief 取得TimeRangeOfDay
	 *
	 * @return 以小时、分来描述的时间范围
	 */
	const Navinfo::Nis::CTimeRangeOfDay& GetTimeRangeOfDay() const;

	/**
	 * @brief 取得DateRangeOfYear
	 *
	 * @return 以日期来描述的时间范围
	 */
	const Navinfo::Nis::CDateRangeOfYear& GetDateRangeOfYear() const;

	/**
	 * @brief 取得DaysOfWeek
	 *
	 * @return 以日、周来描述的时间范围
	 */
	const Navinfo::Nis::CDaysOfWeek& GetDaysOfWeek() const;

	/**
	 * @brief 取得FrequentlyUsedVehicleTypes
	 *
	 * @return 车辆类型
	 */
	const Navinfo::Nis::CFrequentlyUsedVehicleTypes& GetFrequentlyUsedVehicleTypes() const;

	/**
	 * @brief 取得Authorization
	 *
	 * @return 与授权相结合的条件规制，如禁止通行等
	 */
	const Navinfo::Nis::CAuthorization& GetAuthorization() const;

	/**
	 * @brief 取得Occupancy
	 *
	 * @return 与任何限制（如禁止通行等）相结合的车辆乘员数量的条件。
	 */
	const Navinfo::Nis::COccupancy& GetOccupancy() const;

	/**
	 * @brief 取得SlowRoadUsers
	 *
	 * @return 与任何限制（如禁止通行等）相结合的慢行道路用户的条件
	 */
	const CSlowRoadUsers& GetSlowRoadUsers() const;

	/**
	 * @brief 取得PublicServiceVehicles
	 *
	 * @return 与任何限制（如禁止通行等）相结合的公共服务车辆条件。
	 */
	const Navinfo::Nis::CPublicServiceVehicles& GetPublicServiceVehicles() const;

	/**
	 * @brief 取得LinearRange
	 *
	 * @return LinearRange
	 */
	const Navinfo::Nis::CLinearRange& GetLinearRange() const;


public:
	CProhibitedPassageFlag										m_clFlag;									///<	  Flag  
	Navinfo::Nis::CTimeRangeOfDay								m_clTimeRangeOfDay;							///<	  以小时、分来描述的时间范围  
	Navinfo::Nis::CDateRangeOfYear								m_clDateRangeOfYear;						///<	  以日期来描述的时间范围  
	Navinfo::Nis::CDaysOfWeek									m_clDaysOfWeek;								///<	  以日、周来描述的时间范围  
	Navinfo::Nis::CFrequentlyUsedVehicleTypes					m_clFrequentlyUsedVehicleTypes;				///<	  车辆类型  
	Navinfo::Nis::CAuthorization								m_clAuthorization;							///<	  与授权相结合的条件规制，如禁止通行等  
	Navinfo::Nis::COccupancy									m_clOccupancy;								///<	  与任何限制（如禁止通行等）相结合的车辆乘员数量的条件。  
	CSlowRoadUsers												m_clSlowRoadUsers;							///<	  与任何限制（如禁止通行等）相结合的慢行道路用户的条件  
	Navinfo::Nis::CPublicServiceVehicles						m_clPublicServiceVehicles;					///<	  与任何限制（如禁止通行等）相结合的公共服务车辆条件。  
	Navinfo::Nis::CLinearRange									m_clLinearRange;							///<	  LinearRange  
};


/**
 * @brief 通行规制集合
 * 
 */
class DLL_PUBLIC CProhibitedPassageSet
{
public:
	CProhibitedPassageSet();

	explicit CProhibitedPassageSet(
		  const vector< CProhibitedPassage > &m_vclProhibitedPassageList_
		);

public:
	/**
	 * @brief 取得ProhibitedPassageList的数量
	 *
	 * @return ProhibitedPassageList的数量
	 */
	size_t GetNumProhibitedPassageList() const;

	/**
	 * @brief 取得数组ProhibitedPassageList中下标为iNo的元素
	 * @details 
	 *
	 * @return ProhibitedPassageList
	 */
	const CProhibitedPassage& GetProhibitedPassageList( size_t iNo ) const;

	/**
	 * @brief 取得ProhibitedPassageList
	 *
	 * @return ProhibitedPassageList
	 */
	const vector< CProhibitedPassage >& GetProhibitedPassageList() const;


public:
	vector< CProhibitedPassage >								m_vclProhibitedPassageList;					///<	  ProhibitedPassageList  
};

}
}

PRAGMA_PACK_POP

#endif	//	__NISPROHIBITEDPASSAGESTRUCT_H_
